home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 20
/
Cream of the Crop 20 (Terry Blount) (1996).iso
/
os2
/
bind493a.zip
/
res
/
res_debug.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-12-22
|
19KB
|
814 lines
/*
* ++Copyright++ 1985, 1990, 1993
* -
* Copyright (c) 1985, 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: res_debug.c,v 8.7 1995/12/22 10:20:39 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <stdio.h>
#include <netdb.h>
#include <resolv.h>
#if defined(BSD) && (BSD >= 199103)
# include <string.h>
#else
# include "../conf/portability.h"
#endif
#if defined(USE_OPTIONS_H)
# include "../conf/options.h"
#endif
extern const char *_res_opcodes[];
extern const char *_res_resultcodes[];
/* XXX: we should use getservbyport() instead. */
static const char *
dewks(wks)
int wks;
{
static char nbuf[20];
switch (wks) {
case 5: return "rje";
case 7: return "echo";
case 9: return "discard";
case 11: return "systat";
case 13: return "daytime";
case 15: return "netstat";
case 17: return "qotd";
case 19: return "chargen";
case 20: return "ftp-data";
case 21: return "ftp";
case 23: return "telnet";
case 25: return "smtp";
case 37: return "time";
case 39: return "rlp";
case 42: return "name";
case 43: return "whois";
case 53: return "domain";
case 57: return "apts";
case 59: return "apfs";
case 67: return "bootps";
case 68: return "bootpc";
case 69: return "tftp";
case 77: return "rje";
case 79: return "finger";
case 87: return "link";
case 95: return "supdup";
case 100: return "newacct";
case 101: return "hostnames";
case 102: return "iso-tsap";
case 103: return "x400";
case 104: return "x400-snd";
case 105: return "csnet-ns";
case 109: return "pop-2";
case 111: return "sunrpc";
case 113: return "auth";
case 115: return "sftp";
case 117: return "uucp-path";
case 119: return "nntp";
case 121: return "erpc";
case 123: return "ntp";
case 133: return "statsrv";
case 136: return "profile";
case 144: return "NeWS";
case 161: return "snmp";
case 162: return "snmp-trap";
case 170: return "print-srv";
default: (void) sprintf(nbuf, "%d", wks); return (nbuf);
}
}
/* XXX: we should use getprotobynumber() instead. */
static const char *
deproto(protonum)
int protonum;
{
static char nbuf[20];
switch (protonum) {
case 1: return "icmp";
case 2: return "igmp";
case 3: return "ggp";
case 5: return "st";
case 6: return "tcp";
case 7: return "ucl";
case 8: return "egp";
case 9: return "igp";
case 11: return "nvp-II";
case 12: return "pup";
case 16: return "chaos";
case 17: return "udp";
default: (void) sprintf(nbuf, "%d", protonum); return (nbuf);
}
}
static const u_char *
do_rrset(msg, len, cp, cnt, pflag, file, hs)
int cnt, pflag, len;
const u_char *cp, *msg;
const char *hs;
FILE *file;
{
int n;
int sflag;
/*
* Print answer records.
*/
sflag = (_res.pfcode & pflag);
if (n = ntohs(cnt)) {
if ((!_res.pfcode) ||
((sflag) && (_res.pfcode & RES_PRF_HEAD1)))
fprintf(file, hs);
while (--n >= 0) {
if ((!_res.pfcode) || sflag) {
cp = p_rr(cp, msg, file);
} else {
unsigned int dlen;
cp += __dn_skipname(cp, cp + MAXCDNAME);
cp += INT16SZ;
cp += INT16SZ;
cp += INT32SZ;
dlen = _getshort((u_char*)cp);
cp += INT16SZ;
cp += dlen;
}
if ((cp - msg) > len)
return (NULL);
}
if ((!_res.pfcode) ||
((sflag) && (_res.pfcode & RES_PRF_HEAD1)))
putc('\n', file);
}
return (cp);
}
void
__p_query(msg)
const u_char *msg;
{
__fp_query(msg, stdout);
}
#ifdef ultrix
/* ultrix 4.0's packaging has some icky packaging. alias for it here.
* there is more junk of this kind over in res_comp.c.
*/
void
p_query(msg)
const u_char *msg;
{
__p_query(msg);
}
#endif
/*
* Print the current options.
* This is intended to be primarily a debugging routine.
*/
void
__fp_resstat(statp, file)
struct __res_state *statp;
FILE *file;
{
register u_long mask;
fprintf(file, ";; res options:");
if (!statp)
statp = &_res;
for (mask = 1; mask != 0; mask <<= 1)
if (statp->options & mask)
fprintf(file, " %s", p_option(mask));
putc('\n', file);
}
/*
* Print the contents of a query.
* This is intended to be primarily a debugging routine.
*/
void
__fp_nquery(msg, len, file)
const u_char *msg;
int len;
FILE *file;
{
register const u_char *cp, *endMark;
register const HEADER *hp;
register int n;
if ((_res.options & RES_INIT) == 0 && res_init() == -1)
return;
#define TruncTest(x) if (x >= endMark) goto trunc
#define ErrorTest(x) if (x == NULL) goto error
/*
* Print header fields.
*/
hp = (HEADER *)msg;
cp = msg + HFIXEDSZ;
endMark = cp + len;
if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX) || hp->rcode) {
fprintf(file, ";; ->>HEADER<<- opcode: %s, status: %s, id: %d",
_res_opcodes[hp->opcode],
_res_resultcodes[hp->rcode],
ntohs(hp->id));
putc('\n', file);
}
if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX))
putc(';', file);
if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD2)) {
fprintf(file, "; flags:");
if (hp->qr)
fprintf(file, " qr");
if (hp->aa)
fprintf(file, " aa");
if (hp->tc)
fprintf(file, " tc");
if (hp->rd)
fprintf(file, " rd");
if (hp->ra)
fprintf(file, " ra");
}
if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD1)) {
fprintf(file, "; Ques: